package com.shou.api.model.dto;


import com.fasterxml.jackson.annotation.JsonFormat;
import com.shou.types.common.RulePageQueryEnum;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotNull;
import lombok.Data;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.Map;
import java.util.Optional;

/**
 * ClassName:RulePageQueryDTO
 * Project:yvt-rule
 * Package: com.sunlight.api.model.dto
 * Description:参考json
 *
 * @Author Nemo
 * @Create 2024/12/5 14:15
 * @Version 1.0
 */
@Data
public class PageQueryDTO {
    /**
     * 页码
     */
    @Min(value = 1, message = "页码必须大于等于1")
    @NotNull(message = "页码不能为空")
    private Integer pageIndex;

    /**
     * 分页大小
     */
    @Min(value = 1, message = "分页大小必须大于等于1")
    @NotNull(message = "分页大小不能为空")
    private Integer pageSize;

    /**
     * 停车场编号
     */
    private String lotCode;

    /**
     * 是否可用，默认为1
     */
    private Integer isAvailable;

    /**
     * 是否为会员专属车位，默认为0（否）
     */
    private Integer isMemberOnly;

    /**
     * 编号
     */
    private String parkingSpaceCode;

    /**
     * 收费策略描述
     */
    private String description;

    /**
     * 每小时费率
     */
    private BigDecimal hourlyRate;

    /**
     * 生效时间，默认当前时间
     */
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private LocalDateTime createTime;

    /**
     * 修改时间
     */
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private LocalDateTime updateTime;

    /**
     * 会员折扣比例
     */
    private BigDecimal memberDiscount;


    /**
     * 停车场名称
     */
    private String name;

    /**
     * 停车场地址
     */
    private String address;

    /**
     * 地理位置纬度
     */
    private BigDecimal latitude;

    /**
     * 地理位置经度
     */
    private BigDecimal longitude;

    /**
     * 营业时间
     */
    private String operatingHours;

    /**
     * 联系电话
     */
    private String phone;

    /**
     * 收费标准编号，用于应用不同的收费规则
     */
    private String feeScheduleCode;

    /**
     * 用户ID，自增主键
     */
    private Integer userId;

    /**
     * 密码哈希值，用于安全存储
     */
    private String password;

    /**
     * 电子邮件地址
     */
    private String email;

    /**
     * 用户角色
     */
    private String role;

    /**
     * ID，自增主键
     */
    private Integer id;

    /**
     * 预定状态，分为'PENDING'、 'CONFIRMED'、 'CANCELLED'
     */
    private String status;

    /**
     * 预定的起始时间
     */
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private LocalDateTime startTime;

    /**
     * 预定的结束时间
     */
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private LocalDateTime endTime;

    /**
     * 备注信息
     */
    private String remark;

    /**
     * 停车费用
     */
    private BigDecimal cost;

    /**
     * 排序字段
     */
    private String sortName;

    /**
     * 排序顺序
     */
    private Integer sort;


    public static PageQueryDTO getRulePageQueryDTOFromMap(Map<String, Object> pageQueryDTOMap) {
        PageQueryDTO pageQueryDTO = new PageQueryDTO();
        pageQueryDTO.setPageIndex(Optional.ofNullable(pageQueryDTOMap.get("pageIndex"))
                .map(String::valueOf)
                .filter(pageIndex -> !pageIndex.trim().isEmpty())
                .map(Integer::parseInt)
                .orElse(RulePageQueryEnum.DEFAULT_PAGE_INDEX.getValue()));
        pageQueryDTO.setPageSize(Optional.ofNullable(pageQueryDTOMap.get("pageSize"))
                .map(String::valueOf)
                .filter(pageIndex -> !pageIndex.trim().isEmpty())
                .map(Integer::parseInt)
                .orElse(RulePageQueryEnum.DEFAULT_PAGE_SIZE.getValue()));
        // 停车位
        pageQueryDTO.setLotCode(Optional.ofNullable(pageQueryDTOMap.get("lotCode"))
                .map(String::valueOf)
                .orElse(null));
        pageQueryDTO.setIsAvailable(Optional.ofNullable(pageQueryDTOMap.get("isAvailable"))
                .map(String::valueOf)
                .map(Integer::parseInt)
                .orElse(null));
        pageQueryDTO.setUserId(Optional.ofNullable(pageQueryDTOMap.get("userId"))
                .map(String::valueOf)
                .map(Integer::parseInt)
                .orElse(null));
        pageQueryDTO.setId(Optional.ofNullable(pageQueryDTOMap.get("id"))
                .map(String::valueOf)
                .map(Integer::parseInt)
                .orElse(null));
        pageQueryDTO.setIsMemberOnly(Optional.ofNullable(pageQueryDTOMap.get("isMemberOnly"))
                .map(String::valueOf)
                .map(Integer::parseInt)
                .orElse(null));
        pageQueryDTO.setParkingSpaceCode(Optional.ofNullable(pageQueryDTOMap.get("parkingSpaceCode"))
                .map(String::valueOf)
                .orElse(null));
        // 收费标准
        pageQueryDTO.setDescription(Optional.ofNullable(pageQueryDTOMap.get("description"))
                .map(String::valueOf)
                .orElse(null));
        pageQueryDTO.setHourlyRate(Optional.ofNullable(pageQueryDTOMap.get("hourlyRate"))
                .map(String::valueOf)
                .map(BigDecimal::new)
                .orElse(null));
        pageQueryDTO.setCreateTime(Optional.ofNullable(pageQueryDTOMap.get("createTime"))
                .map(String::valueOf)
                .map(LocalDateTime::parse)
                .orElse(null));
        pageQueryDTO.setUpdateTime(Optional.ofNullable(pageQueryDTOMap.get("updateTime"))
                .map(String::valueOf)
                .map(LocalDateTime::parse)
                .orElse(null));
        pageQueryDTO.setMemberDiscount(Optional.ofNullable(pageQueryDTOMap.get("memberDiscount"))
                .map(String::valueOf)
                .map(BigDecimal::new)
                .orElse(null));
        
        // 停车场
        pageQueryDTO.setName(Optional.ofNullable(pageQueryDTOMap.get("name"))
                .map(String::valueOf)
                .orElse(null));
        pageQueryDTO.setAddress(Optional.ofNullable(pageQueryDTOMap.get("address"))
                .map(String::valueOf)
                .orElse(null));
        pageQueryDTO.setLatitude(Optional.ofNullable(pageQueryDTOMap.get("latitude"))
                .map(String::valueOf)
                .map(BigDecimal::new)
                .orElse(null));
        pageQueryDTO.setLongitude(Optional.ofNullable(pageQueryDTOMap.get("longitude"))
                .map(String::valueOf)
                .map(BigDecimal::new)
                .orElse(null));
        pageQueryDTO.setOperatingHours(Optional.ofNullable(pageQueryDTOMap.get("operatingHours"))
                .map(String::valueOf)
                .orElse(null));
        pageQueryDTO.setPhone(Optional.ofNullable(pageQueryDTOMap.get("phone"))
                .map(String::valueOf)
                .orElse(null));
        pageQueryDTO.setFeeScheduleCode(Optional.ofNullable(pageQueryDTOMap.get("feeScheduleCode"))
                .map(String::valueOf)
                .orElse(null));

        //用户
        pageQueryDTO.setPassword(Optional.ofNullable(pageQueryDTOMap.get("password"))
                .map(String::valueOf)
                .orElse(null));
        pageQueryDTO.setEmail(Optional.ofNullable(pageQueryDTOMap.get("email"))
                .map(String::valueOf)
                .orElse(null));
        pageQueryDTO.setRole(Optional.ofNullable(pageQueryDTOMap.get("role"))
                .map(String::valueOf)
                .orElse(null));

        // 预约信息
        pageQueryDTO.setStartTime(Optional.ofNullable(pageQueryDTOMap.get("startTime"))
                .map(String::valueOf)
                .map(LocalDateTime::parse)
                .orElse(null));
        pageQueryDTO.setEndTime(Optional.ofNullable(pageQueryDTOMap.get("endTime"))
                .map(String::valueOf)
                .map(LocalDateTime::parse)
                .orElse(null));
        pageQueryDTO.setStatus(Optional.ofNullable(pageQueryDTOMap.get("status"))
                .map(String::valueOf)
                .orElse(null));
        pageQueryDTO.setLotCode(Optional.ofNullable(pageQueryDTOMap.get("remark"))
                .map(String::valueOf)
                .orElse(null));

        // 停车记录
        pageQueryDTO.setCost(Optional.ofNullable(pageQueryDTOMap.get("cost"))
                .map(String::valueOf)
                .map(BigDecimal::new)
                .orElse(null));

        pageQueryDTO.setSortName(Optional.ofNullable(pageQueryDTOMap.get("sortName"))
                .map(String::valueOf)
                .orElse(null));
        pageQueryDTO.setSort(Optional.ofNullable(pageQueryDTOMap.get("sort"))
                .map(String::valueOf)
                .map(Integer::valueOf)
                .orElse(1));
        return pageQueryDTO;
    }
}
